package concurrent.demo3.context;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName T07_DelayQueue
 * @Description TODO
 * put的元素需要实现delayQueue的接口
 * 任务加进去的时候按时间排序好了
 * 可以用来做定时任务
 *
 * @Author liang
 * @Date 2018/7/4 9:28
 * @Version 1.0
 **/
public class T07_DelayQueue {
    static BlockingQueue<MyTask> tasks = new DelayQueue<>();
    static Random r = new Random();
    static class MyTask implements Delayed{
        long runningTime;
        MyTask(long rt){
            this.runningTime = rt;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert(runningTime - System.currentTimeMillis(),TimeUnit.MILLISECONDS);
        }

        @Override
        public int compareTo(Delayed o) {
            if(this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS)){
                return -1;
            }else if(this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS)){
                return 1;
            }
            return 0;
        }

        @Override
        public String toString() {
            return "MyTask{" +
                    "runningTime=" + runningTime +
                    '}';
        }
    }
    
    public static void main(String [] args){
        long now = System.currentTimeMillis();
        MyTask t1 = new MyTask(now + 1000);
        MyTask t2 = new MyTask(now + 2000);
        MyTask t3 = new MyTask(now + 3000);
        MyTask t4 = new MyTask(now + 4000);
        MyTask t5 = new MyTask(now + 5000);

        try {
            tasks.put(t1);
            tasks.put(t2);
            tasks.put(t3);
            tasks.put(t4);
            tasks.put(t5);
            System.out.println(tasks);
            for(int i=0;i<5;i++){
                System.out.println(tasks.take());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
